package com.neusoft.hifly.message.msg.service;

import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.core.metadata.IPage;

import com.neusoft.hifly.message.msg.api.domain.ReceiveUserVO;
import com.neusoft.hifly.message.msg.entity.MsgInboxObj;
import com.neusoft.hifly.message.msg.entity.MsgObj;

/**
 * Title: 消息服务
 * <p>
 * Description: 收件箱 Service
 * <p>
 * Copyright: 2019
 * <p>
 * Company: 东软汉枫
 *
 * @author lh_neu
 * @version 1.0.0
 */
public interface IMsgInboxService {

	/**
	 * 保存个人消息 当起草消息保存后，根据接收人、接收人ID创建个人消息记录
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param receiveUsers
	 *            接收人
	 * @param msgObj
	 *            父消息对象
	 */
	void saveMsgboxHave(String organCode, long organLogicId, List<ReceiveUserVO> receiveUsers, MsgObj msgObj);

	/**
	 * 保存对象
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param obj
	 *            对象
	 */
	void saveOrUpdate(String organCode, long organLogicId, MsgInboxObj obj);

	/**
	 * 单条消息已读
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param logicId
	 *            逻辑ID
	 */
	void updateIsRead(String organCode, long organLogicId, long logicId);

	/**
	 * 全部消息已读
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param receiveUserLogicId
	 *            接收人
	 */
	void updateAllIsRead(String organCode, long organLogicId, long receiveUserLogicId);

	/**
	 * 根据ID删除对象
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param logicId
	 *            对象ID
	 */
	void deleteByLogicId(String organCode, long organLogicId, long logicId);

	/**
	 * 批量删除对象
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param logicIds
	 *            对象ID，多id使用英文逗号分隔
	 */
	void deleteByBatch(String organCode, long organLogicId, String logicIds);

	/**
	 * 删除对象
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param objLogicId
	 *            业务表单的ID
	 */
	void deleteByObjLogicId(String organCode, long organLogicId, long objLogicId);

	/**
	 * 删除对象
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param msgLogicId
	 *            父消息逻辑ID
	 */
	void deleteByMsgLogicId(String organCode, long organLogicId, long msgLogicId);

	/**
	 * 统计未读信息数量
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户ID
	 * @param userLogicId
	 *            用户ID
	 * @return 数量
	 */
	int countAllUnread(String organCode, long organLogicId, long userLogicId);

	/**
	 * 根据id查询对象
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param logicId
	 *            对象logicId
	 * @return 对象
	 */
	MsgInboxObj getByLogicId(String organCode, long organLogicId, long logicId);

	/**
	 * 查询所有对象
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @return 对象集合
	 */
	List<MsgInboxObj> findAll(String organCode, long organLogicId);

	/**
	 * 查询所有对象
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param msgLogicId
	 *            父消息逻辑ID
	 * @return 对象集合
	 */
	List<MsgInboxObj> findByMsgLogicId(String organCode, long organLogicId, long msgLogicId);

	/**
	 * 根据条件查询
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param property
	 *            参数。其中isLike:Boolean 是否模糊查询
	 * @return 对象集合
	 */
	List<MsgInboxObj> search(String organCode, long organLogicId, Map<String, Object> property);

	/**
	 * 根据条件查询
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param offset
	 *            当前页数
	 * @param limit
	 *            分页长度
	 * @param property
	 *            参数。其中isLike:Boolean 是否模糊查询
	 * @return 返回Map
	 */
	IPage<MsgInboxObj> search(String organCode, long organLogicId, int offset, int limit, Map<String, Object> property);

	/**
	 * 搜索未读消息
	 *
	 * @param organCode
	 *            租户编码
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param offset
	 *            当前页数
	 * @param limit
	 *            分页长度
	 * @param property
	 *            参数。其中isLike:Boolean 是否模糊查询
	 * @return 返回Map
	 */
	Map<String, Object> searchHaveMsg(String organCode, long organLogicId, int offset, int limit,
			Map<String, Object> property);

}